<?php
/**
 * FTP类
 *
 * @copyright  Copyright (c) 2012 www.Mediad.cn
 * @license    New BSD License
 *
 * @example:
 * $ftp = new ftp('222.13.67.42',21,'hlj','123456');          // 打开FTP连接
 * $ftp->up_file('aa.wav','test/13548957217/bb.wav');         // 上传文件
 * $ftp->move_file('aaa/aaa.php','aaa.php');                  // 移动文件
 * $ftp->copy_file('aaa.php','aaa/aaa.php');                  // 复制文件
 * $ftp->del_file('aaa.php');                                 // 删除文件
 * $ftp->close();                                             // 关闭FTP连接
 */
class Mediad2_Utility_Ftp
{
	
	/*
	 * const
	 */
	const FTP_SUCCESS			= 1;		// 成功
	const FTP_ERROR_GENERAL		= 0;		// 失败
	const FTP_ERROR_CONNECT		= -1;		// 连接失败
	const FTP_ERROR_LOGIN		= -2;		// 登录失败
	const FTP_ERROR_UPLOAD		= -3;		// 上传文件失败
	const FTP_ERROR_GET			= -4;		// 获取文件失败
	const FTP_ERROR_MOVE		= -5;		// 移动文件失败
	const FTP_ERROR_COPY		= -6;		// 复制文件失败
	const FTP_ERROR_DELETE		= -7;		// 删除文件失败
	const FTP_ERROR_RENAME		= -8;		// 重命名文件失败
	const FTP_ERROR_MKDIR		= -9;		// 生成目录失败
	
	const FTP_MESSAGE_ERROR_CONNECT 	= 'FTP服务器连接失败';
	const FTP_MESSAGE_ERROR_LOGIN 		= 'FTP服务器登陆失败';
	const FTP_MESSAGE_ERROR_UPLOAD 		= '文件上传失败,请检查权限及路径是否正确！';
	const FTP_MESSAGE_ERROR_GET 		= '文件获取失败,请检查权限及原路径是否正确！';
	const FTP_MESSAGE_ERROR_MOVE 		= '文件移动失败,请检查权限及原路径是否正确！';
	const FTP_MESSAGE_ERROR_COPY 		= '文件复制失败,请检查权限及原路径是否正确！';
	const FTP_MESSAGE_ERROR_DELETE 		= '文件删除失败,请检查权限及路径是否正确！';
	const FTP_MESSAGE_ERROR_RENAME 		= '文件重命名失败,请检查权限及路径是否正确！';
	const FTP_MESSAGE_ERROR_MKDIR 		= '生成目录失败,请检查权限及路径是否正确！';
	
	
	/*
	 * var
	 */
	public $off;                          	// 返回操作状态(成功/失败)
	public $conn_id;                      	// FTP连接
	protected $ftp_host;
	protected $ftp_port;
	protected $ftp_user;
	protected $ftp_pass;
	private $tempFile = "d:/tmp.dat";		//临时文件

	/**
	 * 方法：FTP连接
	 * @FTP_HOST -- FTP主机
	 * @FTP_PORT -- 端口
	 * @FTP_USER -- 用户名
	 * @FTP_PASS -- 密码
	 * @return int|Mediad2_Utility_Ftp
	 */
	public function __construct($FTP_HOST, $FTP_PORT, $FTP_USER, $FTP_PASS)
	{
		$this->ftp_host = $FTP_HOST;
		$this->ftp_port = $FTP_PORT;
		$this->ftp_user = $FTP_USER;
		$this->ftp_pass = $FTP_PASS;
	}
	
	/**
	 * 链接FTP
	 * 
	 * @return int
	 */
	public function connect()
	{
		$this->conn_id = @ftp_connect($this->ftp_host,$this->ftp_port);
		if ($this->conn_id) {
			return self::FTP_SUCCESS;
		} else {
			return self::FTP_ERROR_CONNECT;
		}
	}
	
	/**
	 * 登录FTP
	 * 
	 * @return int
	 */
	public function login()
	{
		if (@ftp_login($this->conn_id, $this->ftp_user, $this->ftp_pass)) {
			@ftp_pasv($this->conn_id,1); // 打开被动模拟
			return self::FTP_SUCCESS;
		} else {
			return self::FTP_ERROR_LOGIN;
		}
	}

	/**
	 * 上传文件
	 * 
	 * @param string $localPath 本地路径
	 * @param string $remotePath 服务器路径
	 * @param boolean $type 若目标目录不存在则新建
	 * @return int
	 */
	public function upload($localPath, $remotePath, $type=true)
	{
		if($type) $this->mkdirs($remotePath);
		$this->off = @ftp_put($this->conn_id,$remotePath,$localPath,FTP_BINARY);
		if(!$this->off) {
			return self::FTP_ERROR_UPLOAD;
		} else {
			return self::FTP_SUCCESS;
		}
	}
	
	/**
	 * 获取文件
	 * 
	 * @param string $localPath 本地路径
	 * @param string $remotePath 服务器路径
	 * @return int
	 */
	public function get($localPath,$remotePath)
	{
		$this->off = @ftp_get($this->conn_id,$localPath,$remotePath,FTP_BINARY);// 下载
		if(!$this->off) {
			return self::FTP_ERROR_GET;
		} else {
			return self::FTP_SUCCESS;
		}
	}

	/**
	 * 返回当前目录
	 */
	public function pwd()
	{
		return @ftp_pwd($this->conn_id);
	}
	
	/**
	 * 变更目录
	 * @param string $directory
	 */
	public function chdir($directory)
	{
		return @ftp_chdir($this->conn_id,$directory);
	}
	
	/**
	 * 列表
	 * @param string $directory
	 */
	public function nlist($directory)
	{
		return @ftp_nlist($this->conn_id,$directory);
	}
	
	/**
	 * 方法：移动文件
	 * @path    -- 原路径
	 * @newpath -- 新路径
	 * @type    -- 若目标目录不存在则新建
	 * @return int
	 */
	public function move($path, $newpath, $type=true)
	{
		if($type) $this->mkdirs($newpath);
		$this->off = @ftp_rename($this->conn_id,$path,$newpath);
			if(!$this->off) {
			return self::FTP_ERROR_MOVE;
		} else {
			return self::FTP_SUCCESS;
		}
	}

	/**
	 * 方法：复制文件
	 * 说明：由于FTP无复制命令,本方法变通操作为：下载后再上传到新的路径
	 * @path    -- 原路径
	 * @newpath -- 新路径
	 * @type    -- 若目标目录不存在则新建
	 * @return int
	 */
	public function copy($path, $newpath, $type=true)
	{
		$downpath = $this->tempFile;
		$this->off = @ftp_get($this->conn_id,$downpath,$path,FTP_BINARY);// 下载
		if(!$this->off) {
			return self::FTP_ERROR_GET;
		}
		return $this->upload($downpath,$newpath,$type);
	}

	/**
	 * 方法：删除文件
	 * @path -- 路径
	 * @return int
	 */
	public function delete($path)
	{
		$this->off = @ftp_delete($this->conn_id,$path);
		if(!$this->off) {
			return self::FTP_ERROR_DELETE;
		} else {
			return self::FTP_SUCCESS;
		}
	}

	/**
	 * 方法：生成目录
	 * @path -- 路径
	 * @return int
	 */
	public function mkdirs($path)
	{
		$path_arr  = explode('/',$path);              // 取目录数组
		$file_name = array_pop($path_arr);            // 弹出文件名
		$path_div  = count($path_arr);                // 取层数

		foreach($path_arr as $val)                    // 创建目录
		{
			if(@ftp_chdir($this->conn_id,$val) == FALSE)
			{
				@ftp_mkdir($this->conn_id,$val);
				$tmp = @ftp_chdir($this->conn_id,$val);
				if($tmp == FALSE)
				{
					if(!$this->off) return self::FTP_ERROR_MKDIR;
					exit;
				}
			}
		}

		for($i=1;$i<=$path_div;$i++)                  // 回退到根
		{
			@ftp_cdup($this->conn_id);
		}
		return self::FTP_SUCCESS;
	}

	/**
	 * 方法：关闭FTP连接
	 */
	public function close()
	{
		@ftp_close($this->conn_id);
	}
	
	/**
	 * 从FTP下载文件
	 * 
	 * @param string $localPath
	 * @param string $remotePath
	 */
	public function download($localPath, $remotePath)
	{
		//链接FTP服务器
		if ($this->connect()) {	//链接FTP服务器
			if ($this->login()) {	//登录FTP服务器
				//获得文件
				$tmpfile = tempnam( getcwd()."/", "temp" ); // 创建唯一的临时文件
				if ($this->get($tmpfile, $remotePath)) {
					$this->close();
		
					$download = new Mediad2_Utility_Bfdownload($tmpfile, $localPath);
					$download->download_file();
		
					unlink($tmpfile ); // 删除临时文件
					exit;
				}
				unlink($tmpfile ); // 删除临时文件
			}
		}
		$this->close();
	}
}
// class class_ftp end




